var x;  // 声明变量
x = 0;  // 给变量赋值
console.log('x的值为', x);  // 输出x值为0

// js数据类型
x = 1;  // 数字
x = 0.01;  // 整数和实数共用一种数据类型
x = "hello world";  // 双引号内文本构成字符串
x = 'javaScript';  // 单引号文本同样构成字符串
x = true; // 布尔值
x = false; // 另一个布尔值
x = null;  // null为特殊值，表示空
x = undefined;  // undefined和null非常类似

// 声明对象
var book = {
    topic: 'JavaScript',
    fat: true
};

// 通过.和[] 访问和修改对象元素
console.log('topic为', book.topic);
console.log('fat为', book['fat']);
book.author = 'Flanagan'; // 创建新的属性
book.contents = {};  // 创建的新属性为空对象

// 声明数组
var primes = [2, 3, 5, 7];
console.log('数组第一项', primes[0]);
console.log('数组长度', primes.length);
console.log('数组最后一个元素', primes[primes.length - 1]);
primes[4] = 9;  // 赋值新的元素
primes[4] = 11;  // 修改元素值
var empty = [];  // 声明空数组
console.log('空数组长度', empty.length);

// 数组和对象中都可以包含另一个数组或对象
var points = [
    {x: 0, y: 0},
    {x: 1, y: 1}
];
var data = {
    trial1: [[1, 2], [3, 4]],
    trial2: [[2, 3], [4, 5]]
};

// 运算符
console.log('加法', 3 + 2);
console.log('减法', 3 - 2);
console.log('乘法', 3 * 2);
console.log('除法', 3 / 2);
console.log('复杂的操作数', points[1].x - points[0].x);
console.log('字符串拼接', '3' + '2');

// 运算符简写
var count = 0
console.log('自增1', ++count);
console.log('自减1', --count);
console.log('自加2', count += 2);
console.log('自乘3', count *= 3);
console.log('当前变量', count);

// 比较运算符
var x = 2, y = 3;
console.log('相等', x == y);
console.log('不等', x != y);
console.log('小于', x < y);
console.log('小于等于', x <= y);
console.log('大于', x > y);
console.log('大于等于', x >= y);
console.log('字符串相等', 'two' == 'three');
console.log('字符串大于', 'two' > 'three');  // 'tw'在字母表中的索引大于'th'
console.log('布尔值等于', false == (x > y)); // false与false 相等

// 逻辑运算符
console.log('与', (x == 2) && (y == 3));
console.log('或', (x > 3) || (y < 3));
console.log('非', !(x == y));

// 函数声明
function plus1(x) {
    return x + 1;
}
console.log('函数plus1:', plus1(y));

var square = function (x) {
    return x * x;
}
console.log('函数square:', square(plus1(y)));

// 当把函数赋值给对象时，我们就称该函数为这个对象的方法
var a = [];
console.log('数组通过push赋值,返回数组长度', a.push(1, 2, 3));
console.log('翻转数组元素:', a.reverse());

// 给对象定义方法
points.dist = function () {
    var p1 = this[0];
    var p2 = this[1];
    var a = p2.x - p1.x;
    var b = p2.y - p1.y;
    return Math.sqrt(a * a + b * b);  // 勾股定理求得两点之间距离
};
console.log('平方根:', points.dist());

// 条件和循环
// 返回绝对值
function abs(x) {
    if (x >= 0) {
        return x;
    } else {
        return -x;
    }
}
// 计算阶乘
function factorial(n) {
    var product = 1;
    while (n > 1) {
        product *= n;
        n--;
    }
    return product;
}
console.log('阶乘', factorial(4));
function factorial2(n) {
    var i, product = 1;
    for (i = 2; i <= n; i++) {
        product *= i;
    }
    return product;
}
console.log('阶乘2', factorial2(5));

// 面向对象编程
// 声明构造函数
function Point(x, y) {
    this.x = x;
    this.y = y;
}
// 初始化一个点
var p = new Point(1, 1);
// 给对象添加方法
Point.prototype.r = function () {
    return Math.sqrt(this.x * this.x + this.y * this.y);
}
console.log('点到原点的距离:', p.r());
